package com.yx.websocketim

import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.extensions.LayoutContainer
import kotlinx.android.synthetic.main.item_recycler_msg.*

/**
 * Creator:Yx
 * Time:2022/7/13 11:28
 * Description:RecyclerViews适配器
 */
class RecyclerViewsAdapter(context: Context) :
    RecyclerView.Adapter<RecyclerViewsAdapter.AdapterHolder>() {

    private var mContext: Context? = null

    // Kotlin 分为可变数组（MutableList），和不可变数组（listof（）），
    private var mLists: MutableList<String> = mutableListOf()

    // 构造方法初始化
    init {
        this.mContext = context
    }


    fun setData(list: MutableList<String>) {
        this.mLists = list
        notifyDataSetChanged()
    }

    fun addData(list: MutableList<String>) {
        if (this.mLists.isNotEmpty()) {
            val sz = this.mLists.size
            this.mLists.addAll(list)
            notifyItemRangeChanged(sz, this.mLists.size)
        } else {
            this.mLists = list
            notifyDataSetChanged()
        }
    }

    fun addData(str: String) {
        val sz = this.mLists.size
        this.mLists.add(str)
        notifyItemRangeChanged(sz, this.mLists.size)
    }

    fun getData(): MutableList<String> {
        return this.mLists
    }


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AdapterHolder {
        val view = LayoutInflater.from(mContext).inflate(R.layout.item_recycler_msg, parent, false)
        return AdapterHolder(view)
    }

    override fun getItemCount(): Int {
        return this.mLists.size
    }

    override fun onBindViewHolder(holder: AdapterHolder, position: Int) {
        /**
        // val holders = holder as AdapterHolder // 不转换也行，它自己会智能转换，但是holder会变色提示
        holder.apply {
        /**
         * apply在闭包范围内可以任意调用该对象的任意方法,并在最后返回该对象.
         * 函数体内指定当前对象：this
         * 最适用于数据model多层包裹的判空
         * apply函数示例：
         * 原先多重判断：if(xx==null)return;  if(xx.xxx ==null)return;if(xx.xxx.xxxx == null)return;
         * apply: xx?.apply{执行1}?.xxx?.apply{执行2}?.xxxx?.apply{执行3}
        */
        this.setDefault("某人$position： " + mLists[position])
        }
         */
        val mStr = "某人$position： ${mLists[position]} "
        holder.item_tv_message.text = mStr
        holder.item_tv_message.textSize = 16F

    }


    /**
     * inner 修饰内部类
     * 内部类使用this,访问外部类的变
     */
    inner class AdapterHolder(itemView: View) : RecyclerView.ViewHolder(itemView), LayoutContainer {
        /**
         * 如果仍然选择KAE(Kotlin-Android-Extensions)作为View绑定框架，将会出现Holder根本没发挥应有的用处的情况
         * 那么在Adapter中使用时，请尽量避免直接使用holder.itemView.xxx的形式( 每次都会调用itemView.findViewById() )
         * 而是接入LayoutContainer来实现，这样会有更好的性能表现
         * （holder.titleTextView.text = "r"初次调用findViewById()之后会缓存进HashMap里）
         *
         * 将ViewHolder实现LayoutContainer接口，即可以直接使用控件Id了
         */
        override val containerView: View = this.itemView
    }

    /**
     * 如果仍然选择KAE(Kotlin-Android-Extensions)作为View绑定框架，将会出现Holder根本没发挥应有的用处的情况
     * 那么在Adapter中使用时，请尽量避免直接使用holder.itemView.xxx的形式( 每次都会调用itemView.findViewById() )
     * 而是接入LayoutContainer来实现，这样会有更好的性能表现
     * （holder.titleTextView.text = "right way"/初次调用findViewById()之后会缓存进HashMap里）
     */

    inner class AdapterHolders(itemView: View) : RecyclerView.ViewHolder(itemView) {
        lateinit var tvMessage: TextView
        lateinit var data: String

        // 构造方法
        init {
            this.tvMessage = itemView.findViewById(R.id.item_tv_message)
        }

        // 多个构造方法
        init {
            this.data = "Adapter构造"
            LogUtils.iYx(this.data)
        }

        fun setDefault(msg: String) {
            // 变量后面加？，遇到null时，不抛出异常处理，返回 null
            // let 操作符的作用就是当调用者为非空的时候会执行let表达式里面的函数体
            this.tvMessage.let {
                // 函数体内指代当前对象：it
                it.text = msg
                it.textSize = 16F
                // it.textColors("FFFFFF")
            }
        }

    }

}